package com.zjsru.oneDay202211;

/**
 * @Author: CookLee
 * @Date: 2022/11/29
 *  生成交替二进制字符串的最少操作数
 *
 * 输入：s = "0100"
 * 输出：1
 * 解释：如果将最后一个字符变为 '1' ，s 就变成 "0101" ，即符合交替字符串定义。
 *
 * 输入：s = "10"
 * 输出：0
 * 解释：s 已经是交替字符串。
 *
 * 输入：s = "1111"
 * 输出：2
 * 解释：需要 2 步操作得到 "0101" 或 "1010" 。
 */
public class MinOperations {
    
    /**
     * 只有两种结果：「从 0 开始的交替串」和「从 1 开始的交替串」
     */
    public int minOperations(String s) {
        int ans = 0;
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            //对字符串的每个字符进行判断 是否符合交替规则，固定被减数0表示默认按照0开头所需翻转的次数
            //“^”运算符（位异或）,两数相同为0，不同为1
            ans += (chars[i] - '0') ^ (i & 1);
        }
        //计算出变为其中一种结果字符串（开头0）的最少操作数，就可以推出另一个最少操作数，然后取最小值即可。
        return Math.min(ans, s.length() - ans);
    }
    
    public static void main(String[] args) {
        MinOperations operations = new MinOperations();
        String s = "10010100";
        System.out.println(operations.minOperations(s));
    }
    
}
